var GeneratorId = require('../utils/generator-id.js')();
var DeepCopy = require('../utils/deepcopy.js');
/**
 * 数据模型模板
 * @param {Object} cfg
 */
window.GiraffObjectManager ={};
var UDM = function(cfg) {
	var _udm_id = GeneratorId.getId('UDM');
	/**
	 * 创建基础的数据模型属性，可以被覆盖
	 */
	var config = {
		value: '', //默认值
		type: '', //预留数据类型
		autoValidate: true, //默认为焦点离开时自动校验
		validator: [] //校验规则
	}
	//复制外界传入的配置
	for(var key in cfg) {
		config[key] = cfg[key];
		if(key == "validator"){
			for(var i in config[key]){
				if(config[key][i].autoValidate == undefined){
					config[key][i].autoValidate = true;
				}
			}
		}
	}
	/**
	 * 创建数据模型私有的属性及方法，无法被覆盖的
	 */
		//数据绑定标识，private字段，外界不许改变，只能框架内部使用
	config.dmbind = _udm_id;
	//绑定校验提示组件REF，private字段，外界不许改变，只能框架内部使用
	config.relation = '';
	config.setValue = function(v) {
		this.value = DeepCopy.copy(this.value,v);
		UEventHub.emit(this.dmbind + UI_EVENT_CONST.SET_UDM_VALUE_EVENT, this.value);
	};
	config.getValue = function() {
		return this.value;
	};
	config.setRelation = function(relation) {
		this.relation = relation;
	};
	config.getRelation = function() {
		return this.relation;
	};
	/**
	 * UDM校验方法
	 * @param {Object} v
	 */
	config.validate = function(v,bool) {
		if(bool == undefined){
			bool = true;
		}
		var validMsg = CheckValidator(config.getValue(),config.validator,bool);
		UEventHub.emit(config.dmbind + UI_EVENT_CONST.ONVALIDATE_EVENT, validMsg);
		if(!validMsg){
			return true;
		}else{
			return false;
		}
	}
	config.setError = function(validMsg){
		setTimeout(function () {
            UEventHub.emit(config.dmbind + UI_EVENT_CONST.ONVALIDATE_EVENT, validMsg);
        },0)

	}
	/**
	 * 焦点离开校验方法，当autoValidate=true时，绑定的组件在焦点离开时，自动触发校验。
	 * @param {Object} v
	 */
	config._onBlurValidate = function(v) {
		/*if(this.autoValidate) { //默认自动校验
			this.validate(v);
		}*/
		this.validate(v,false);
	};
	//监听onblur事件，触发校验机制
	UEventHub.on(config.dmbind + UI_EVENT_CONST.ONBLUR_EVENT, function(v) {
		config._onBlurValidate(v);
	});
	//监听相关联绑定的DOM元素的值变化，同步更新数据模型的值
	UEventHub.on(config.dmbind+UI_EVENT_CONST.SET_UI_VALUE_EVENT, function(v) {
		config.value = v;
	});
	GiraffObjectManager[_udm_id] = config;
	return config;
}

module.exports = UDM;